package main

import (
	"log"
	"runtime/debug"

	"gitee.com/wao520/obtain_data/global"
	"gitee.com/wao520/obtain_data/routers"

	"gitee.com/wao520/obtain_data/pkg/result"
	"github.com/gin-gonic/gin"
)

// init函数用于在程序启动时初始化数据库连接。
// 它首先调用global.SetupDBLink()来设置数据库链接。
// 如果数据库链接设置过程中出现错误(err != nil)，则使用log.Fatalf记录错误信息并终止程序。
// 这是因为数据库链接对于程序的正常运行至关重要，如果初始化失败，程序无法继续执行。
func init() {
	err := global.SetupSetting()
	if err != nil {
		log.Fatalf("init.setupSetting err: %v", err)
	}

	//logger
	err = global.SetupLogger()
	if err != nil {
		log.Fatalf("init.SetupLogger err: %v", err)
	}

	err = global.SetupDBLink()
	if err != nil {
		log.Fatalf("init.setupDBEngine err: %v", err)
	}
	err = global.SetupRedisDb()
	if err != nil {
		log.Fatalf("init.SetupRedisDb err: %v", err)
	}
	err = global.SetupGlobalCache()
	if err != nil {
		log.Fatalf("init.SetupGlobalCache err: %v", err)
	}
	global.Logger.Infof("------应用init结束")
}
func main() {
	global.Logger.Infof("------应用main函数开始")
	//设置运行模式
	gin.SetMode(global.ServerSetting.RunMode)
	// 创建一个默认的路由引擎
	r := gin.Default()
	//处理异常
	r.NoRoute(HandleNotFound)
	r.NoMethod(HandleNotFound)
	r.Use(Recover)
	// 使用gin.StaticFile()方法
	r.StaticFile("/favicon.ico", "./static/favicon.ico")

	// 加载 全部路由
	routers.RoutersInit(r)
	// 启动服务器
	r.Run(":" + global.ServerSetting.HttpPort)
}

// 404
func HandleNotFound(c *gin.Context) {
	global.Logger.Errorf("handle not found: %v", c.Request.RequestURI)
	//global.Logger.Errorf("stack: %v",string(debug.Stack()))
	result.NewResult(c).ErrorCode(404, "资源未找到")
}

// 500
func Recover(c *gin.Context) {
	defer func() {
		if r := recover(); r != nil {
			//打印错误堆栈信息
			//log.Printf("panic: %v\n", r)
			global.Logger.Errorf("panic: %v", r)
			//log stack
			global.Logger.Errorf("stack: %v", string(debug.Stack()))
			//print stack
			debug.PrintStack()
			//return
			result.NewResult(c).ErrorCode(500, "服务器内部错误")
		}
	}()
	//继续后续接口调用
	c.Next()
}
